import { Toast } from 'vant';
import axios from 'axios'; // 引入axios
import QS from 'qs'; // 引入qs模块，用来序列化post类型的数据

if (process.env.NODE_ENV === 'development') {
    axios.defaults.baseURL = 'https://www.fastmock.site/mock/0764b93cba70add273910b232c51aad8/development/';
}
if (process.env.NODE_ENV === 'production') {
    axios.defaults.baseURL = 'https://www.fastmock.site/mock/0764b93cba70add273910b232c51aad8/development/';
}
if (process.env.NODE_ENV === 'debug') {
    axios.defaults.baseURL = '';
}

// 请求超时时间
axios.defaults.timeout = 10000;

// post请求头
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

let windowLoadingcontrol = false;

// 请求拦截器
axios.interceptors.request.use(config => {
    windowLoadingcontrol = setTimeout(() => { // 0.5秒内的接口不显示loading
        if (windowLoadingcontrol) {
            Toast.loading({
                message: '加载中...',
                forbidClick: true,
                duration: 0
            });
        };
    }, 500);

    Toast.loading({
        message: '加载中...',
        forbidClick: true,
        duration: 0
    });

    // console.log('请求拦截器');
    // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
    // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
    const token = 1 || getStore({ name: 'access_token', type: "string" });
    if (token) {
        config.headers.Authorization = 'Bearer ' + token;
    }
    return config;
}, error => {
    Toast.clear();
    return Promise.error(error);
})

// 响应拦截器
axios.interceptors.response.use(response => {
    clearTimeout(windowLoadingcontrol);
    windowLoadingcontrol = false;
    Toast.clear();
    // console.log('响应拦截器', response);
    return response;
}, (error) => {
    clearTimeout(windowLoadingcontrol);
    windowLoadingcontrol = false;
    Toast.clear();
    console.log(error.response);
    return Promise.reject(error)
})

/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function get(url, params) {
    return new Promise((resolve, reject) => {
        axios.get(url, { params: params }).then(res => {
            resolve(res.data);
        }).catch(err => {
            reject(err.data);
        })
    });
}

/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function post(url, params) {
    return new Promise((resolve, reject) => {
        var parameters = QS.stringify(params);
        axios.post(url, parameters).then((res) => {
            resolve(res.data);
        }).catch(err => {
            reject(err.data);
        })
    });
}

/**
 * put方法， 对应put请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function put(url, params) {
    return new Promise((resolve, reject) => {
        axios.put(url, QS.stringify(params)).then(res => {
            resolve(res.data);
        }).catch(err => {
            reject(err.data);
        })
    });
}

/**
 * del方法， 对应delete请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
function del(url, params) {
    return new Promise((resolve, reject) => {
        axios.delete(url, QS.stringify({ data: params })).then(res => {
            resolve(res.data);
        }).catch(err => {
            reject(err.data);
        })
    });
}

/**
 * upload方法   文件上传
 * @param {Array} files [文件对象数组]
 */
function upload(files) {
    let param = new FormData(); //创建form对象
    files.map((item) => {
        param.append('files', item); //通过append向form对象添加数据
    })
    let config = {
        headers: { 'Content-Type': 'multipart/form-data' }
    };
    return new Promise((resolve, reject) => {
        axios.post('/api/file-service/file/upload', param, config).then(res => {
            resolve(res.data);
        }).catch(err => {
            reject(err.data);
        })
    });
}

/**
 * download方法
 * @param {String} type [请求的方式]
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * @param {String} fileType [导出文件类型] 默认值 xls
 * @param {String} fileName [导出文件名称] 默认值 导出文件
 */
function download(url, params, fileType, fileName) {
    fileType = fileType || 'xls';
    fileName = fileName || '导出文件';
    let config = {
        params: params,
        headers: {
            'content-disposition': "attachment;filename=total." + fileType,
            'Content-Type': 'application/x-download;charset=utf-8',
        },
        responseType: 'blob'
    };
    return new Promise((resolve, reject) => {
        axios.get(url, config).then(err => {
            resolve(err.data);
            if (!err) {
                return
            }
            let url = window.URL.createObjectURL(err.data);
            let link = document.createElement('a');
            link.style.display = 'none';
            link.href = url;
            link.setAttribute('download', `${fileName}.${fileType}`);
            document.body.appendChild(link);
            link.click();
        }).catch(err => {
            reject(err.data);
        })
    });
}

export default {
    get,
    post,
    put,
    del,
    upload,
    download
}